import { observe } from './observe.js'
import Dep from './Dep.js'
export default function defindReactive(data, key, val) {
    //此处dep是闭包中的
    const dep = new Dep();
    if (arguments.length == 2) {
        val = data[key];
    }
    //子元素要进行observe，至此形成了递归；这个递归不是函数调用自己，是多个函数形成循环调用
    let childOb = observe(val);
    Object.defineProperty(data, key, {
        enumerable: true,
        configurable: true,
        get() {
            //如果现在处于依赖收集阶段
            if (Dep.target) {
                dep.depend();
                if (childOb) {
                    childOb.dep.depend();
                }
            }
            return val;
        },
        set(newval) {
            if (newval === val) {
                return;
            }
            val = newval;
            //当设置了新值，新值也要被observe，不然不是响应式的
            childOb = observe(newval);
            //发布订阅模式，通知dep
            dep.notify();
        }
    });
}